package cn.dai.servlet;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import java.lang.reflect.Method;

/**
 * @author ArkD42
 * @file JavaWeb
 * @create 2020 - 06 - 09 - 15:13
 */

public abstract class BaseServlet extends HttpServlet {

    /**
     * 不管POST & GET 都应该从GET反射统一调用
     * @param req
     * @param resp
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {

        // 按照统一的参数标识获取方法
        String wanna = req.getParameter("wanna");

        try {

            // 创建子类的字节实例
            Class<? extends BaseServlet> aClass = this.getClass();

            // 注意我们的Servlet，这里指向的是一个子类的实例
            BaseServlet baseServlet = aClass.newInstance();

            // 从字节实例中获取子类实例的独有方法,参数是方法的名字，和要注入的参数的所属类型
            Method declaredMethod = aClass.getDeclaredMethod(wanna,HttpServletRequest.class, HttpServletResponse.class);

            // 方法调用，需要一个调用此方法的实例，和上述的类型的值
            // 这里是否需要返回对象，是一个问题？
            Object invoke = declaredMethod.invoke(baseServlet, req,resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 如果是POST方法，请求
     * @param req
     * @param resp
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
        doGet(req, resp);
    }
}
